home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / COMPRESS.I < prev    next >
Encoding:
Text File  |  1990-11-10  |  17.5 KB  |  3 lines

  1. ⓪ IMPLEMENTATION MODULE Compressions;⓪ (*$R-,Y+*)⓪ ⓪ (*⓪"16.09.89: Korrektur in Decode.readCode⓪ *)⓪ ⓪ ⓪ (*⓪ FROM    InOut   IMPORT WriteString, WriteLn, WriteCard, Write;⓪ ⓪ FROM StrConv IMPORT CardToStr, HexToStr;⓪ *)⓪ ⓪ FROM SYSTEM IMPORT ASSEMBLER;⓪ ⓪ FROM    SYSTEM  IMPORT ADDRESS,⓪7TSIZE;⓪ ⓪ FROM    Storage IMPORT ALLOCATE, DEALLOCATE;⓪ ⓪ FROM    BinOps IMPORT LowerLCard;⓪ ⓪ IMPORT  Block;⓪ ⓪ ⓪ CONST   maxTable = 2047;⓪(maxHash  = 4073;        (*  Sollte prim sein  *)⓪(hashStep = 31;          (*  Sollte prim sein  *)⓪(maxStr   = 49;⓪ ⓪(increaseWidth   = 256;⓪(newTable        = 257;⓪(firstFreeEntry  = 258;⓪ ⓪ TYPE    ptrChar         = POINTER TO CHAR;⓪(ptrCard         = POINTER TO CARDINAL;⓪(string          = ARRAY[0..maxStr] OF CHAR;⓪ ⓪(hashTaElem      = RECORD⓪<used: BOOLEAN;⓪<elem: CARDINAL;⓪:END;⓪(hashTable       = POINTER TO ARRAY[0..MaxCard] OF hashTaElem;⓪ ⓪((*  ACHTUNG: 'copyCurrentIntoTable' und 'stringsEqual' baut auf⓪)*           dem Aussehen des Record's auf.⓪)*)⓪(codeTaElem      = RECORD⓪<len: CARDINAL;⓪<str: string;⓪:END;⓪(codeTable       = POINTER TO ARRAY[0..MaxCard] OF codeTaElem;⓪(⓪((*  ACHTUNG: 'Decode' baut auf der Länge des Record's auf.⓪)*           (Bei Array indizierung)⓪)*           'initDecodeTable' baut auf der STRUKTUR des Record's⓪)*           auf.⓪)*)⓪(decodeTaElem    = RECORD⓪<prefix: CARDINAL;⓪<first, last: CHAR;⓪:END;⓪(decodeTable     = POINTER TO ARRAY[0..MaxCard] OF decodeTaElem;⓪ ⓪ ⓪ PROCEDURE initCodeTable (table: codeTable; hash: hashTable);⓪"VAR i: CARDINAL;⓪"BEGIN⓪$FOR i:= 0 TO 255 DO⓪&table^[i].str[0]:= CHR (i);⓪&table^[i].str[1]:= 0C;⓪$END;⓪$FOR i := 0 TO maxHash DO hash^[i].used := FALSE END;⓪"END initCodeTable;⓪ ⓪ (*  VAR bei 'currentString' nur aus Effizenzgründen.⓪!*)⓪ PROCEDURE searchCodeTable (VAR currentString: string;⓪?stringLength : CARDINAL;⓪?table        : codeTable;⓪?hash         : hashTable;⓪;VAR success      : BOOLEAN;⓪;VAR newCode      : CARDINAL;⓪?newEntry     : CARDINAL);⓪?⓪"VAR i: CARDINAL;⓪"⓪"(*$L-*)⓪"PROCEDURE stringsEqual (entryNo: CARDINAL): BOOLEAN;⓪"⓪$BEGIN⓪&ASSEMBLER⓪(MOVE.W  #maxStr, D0⓪(ADDQ.W  #4, D0                  ; 'str' fängt bei null an + 'len'⓪(AND.W   #-2, D0                 ; außerdem grade Anzahl von bytes⓪(MULU    -(A3), D0⓪(MOVE.L  table(A6), A0⓪(MOVE.W  #FALSE, (A3)+⓪(ADDA.L  D0, A0⓪(LEA     codeTaElem.str(A0), A1⓪(MOVE.L  currentString(A6), A2⓪(MOVE.W  stringLength(A6), D1⓪(CMP.W   codeTaElem.len(A0), D1⓪(BNE     ende⓪ ⓪(SUBQ.W  #1, D1⓪ loop⓪(MOVE.B  (A1)+, D0⓪(CMP.B   (A2)+, D0⓪(DBNE    D1, loop⓪(BNE     ende⓪(MOVE.W  #TRUE, -2(A3)⓪(⓪ ende⓪&END;⓪$END stringsEqual;⓪$(*$L=*)⓪$⓪"BEGIN⓪$⓪$i := (stringLength + ORD (currentString[0]) * 256) MOD (maxHash + 1);⓪$⓪$success := FALSE;⓪$WHILE hash^[i].used AND NOT success DO⓪$⓪&IF stringsEqual (hash^[i].elem) THEN⓪ (*⓪ currentString[stringLength] := 0C;⓪ table^[hash^[i].elem].str[table^[hash^[i].elem].len] := 0C;⓪ WriteString (currentString); WriteString (' = ');⓪ WriteString (table^[hash^[i].elem].str); WriteLn;⓪ *)⓪(success := TRUE;⓪(newCode := hash^[i].elem;⓪ (*⓪ WriteString ('  code: '); WriteCard (newCode, 0); WriteLn;⓪ *)⓪&ELSE⓪(i := (i + hashStep) MOD (maxHash + 1);⓪&END;⓪&⓪$END;⓪$IF NOT success THEN⓪&hash^[i].used := TRUE;⓪&hash^[i].elem := newEntry;⓪$END;⓪$⓪$(*⓪$i := firstFreeEntry;⓪$success := FALSE;⓪$⓪$WHILE (i < newEntry) AND NOT success DO⓪&⓪&IF stringsEqual () THEN⓪(newCode := i;⓪(success := TRUE;⓪(⓪&ELSE INC (i); END;⓪$⓪$END;⓪$*)⓪$⓪"END searchCodeTable;⓪#⓪ PROCEDURE Encode (    type     : CARDINAL;⓪6source   : ADDRESS;⓪6sourceLen: LONGCARD;⓪6dest     : ADDRESS;⓪6destLen  : LONGCARD;⓪2VAR codeLen  : LONGCARD);⓪ ⓪"VAR currentString  : string;⓪&stringLength,⓪&nextEntry,⓪¤tCode,⓪&nextW,⓪&newCode,⓪&bitWidth, bit  : CARDINAL;⓪&i              : LONGCARD;⓪&success        : BOOLEAN;⓪&ch             : CHAR;⓪&table          : codeTable;⓪&hash           : hashTable;⓪&destLenSave    : LONGCARD;⓪&destSave       : ptrCard;⓪&charSource     : ptrChar;⓪&destLP         : POINTER TO LONGCARD;⓪ ⓪"PROCEDURE writeCode (c: CARDINAL);⓪"⓪$(*$L-*)⓪$BEGIN⓪&ASSEMBLER⓪(MOVE.L  D3, -(A7)⓪ ⓪(MOVE.L  dest(A6), A0⓪(MOVE.L  codeLen(A6), A1⓪(MOVE.L  (A1), D3⓪(MOVE.L  destLen(A6), D2⓪(MOVEQ   #0, D0⓪(MOVE.W  -(A3), D0⓪(MOVE.W  bit(A6), D1⓪(BEQ     noOr⓪(LSL.L   D1, D0⓪(TST.L   D2⓪(BEQ     noOr⓪(OR.B    (A0), D0⓪ noOr⓪(ADD.W   bitWidth(A6), D1⓪ loop⓪(ADDQ.L  #1, D3⓪(SUBQ.L  #1, D2⓪(BCS     notEnoughRoom⓪(MOVE.B  D0, (A0)+⓪(LSR.L   #8, D0⓪(BRA     cont⓪ notEnoughRoom⓪(ADDQ.L  #1, D2⓪ cont⓪(SUBQ.W  #8, D1⓪(BHI     loop⓪(BEQ     notByteAligned⓪(⓪(SUBQ.L  #1, A0⓪(ADDQ.L  #1, D2⓪(SUBQ.L  #1, D3⓪(ADDQ.W  #8, D1⓪ ⓪ notByteAligned⓪(MOVE.W  D1, bit(A6)⓪(MOVE.L  D2, destLen(A6)⓪(MOVE.L  D3, (A1)        ; codelen⓪(MOVE.L  A0, dest(A6)⓪(⓪(MOVE.L  (A7)+, D3⓪&END;⓪$END writeCode;⓪$(*$L=*)⓪"⓪"PROCEDURE copyCurrentIntoTable;⓪"⓪$(*$L-*)⓪$BEGIN⓪&ASSEMBLER⓪(MOVE.W  #maxStr, D0⓪(ADDQ.W  #4, D0                  ; 'str' fängt bei null an + 'len'⓪(AND.W   #-2, D0                 ; außerdem gerade Anzahl von bytes⓪(MULU    nextEntry(A6), D0⓪(MOVE.L  table(A6), A0⓪(ADDA.L  D0, A0⓪(LEA     codeTaElem.str(A0), A1⓪(LEA     currentString(A6), A2⓪(MOVE.W  stringLength(A6), D0⓪(MOVE.W  D0, codeTaElem.len(A0)⓪(SUBQ.W  #1, D0⓪ loop⓪(MOVE.B  (A2)+, (A1)+⓪(DBF     D0, loop⓪&END;⓪$END copyCurrentIntoTable;⓪$(*$L=*)⓪0⓪"BEGIN (* Encode *)⓪ ⓪$codeLen := 0L;⓪$IF sourceLen = 0L THEN RETURN END;⓪$ALLOCATE (table, TSIZE (codeTaElem) * LONG (maxTable + 1));⓪$IF table = NIL THEN RETURN END;⓪$ALLOCATE (hash, TSIZE (hashTaElem) * LONG (maxHash + 1));⓪$IF hash = NIL THEN⓪&DEALLOCATE (table, 0 (* TSIZE (codeTaElem) * LONG (maxTable + 1) *) );⓪&RETURN⓪$END;⓪$IF dest = NIL THEN destLen := 0L END;⓪$charSource := ptrChar (source);⓪$⓪$bit := 0;⓪$bitWidth := 9;⓪$nextW := 512;⓪$nextEntry := firstFreeEntry;⓪$initCodeTable (table, hash);⓪$ch := charSource^;⓪$INC (charSource);⓪$currentString[0] := ch;⓪$stringLength := 1;⓪$currentCode := ORD (ch);⓪$⓪$(* 1. CARDINAL des Ausgabepuffers erhält Kodierungskennung, 0=keine Kod. *)⓪$(* Darauf folgt die Originallänge als LONGCARD *)⓪$destSave:= dest;⓪$destLenSave:= destLen;⓪$INC (codeLen,6);⓪$IF destLen >= 6L THEN⓪&(* 1. Byte vom Puffer überspringen *)⓪&INC (dest,6);⓪&DEC (destLen,6);⓪$ELSE⓪&destLen:= 0⓪$END;⓪ ⓪$FOR i := 2L TO sourceLen DO⓪&ch := charSource^;⓪&INC (charSource);⓪¤tString[stringLength] := ch;⓪&INC (stringLength);⓪&searchCodeTable (currentString, stringLength, table, hash,⓪7success, newCode, nextEntry);⓪&⓪&IF success AND (stringLength # maxStr) THEN⓪(currentCode := newCode⓪&ELSE⓪(writeCode (currentCode);⓪(IF NOT success THEN⓪*copyCurrentIntoTable;⓪*INC (nextEntry);⓪*IF nextEntry = maxTable THEN⓪,writeCode (newTable);⓪,initCodeTable (table, hash);⓪,bitWidth := 9;⓪,nextW := 512;⓪,nextEntry := firstFreeEntry;⓪*END;⓪(END;⓪(⓪(IF nextEntry = nextW THEN⓪*INC (nextW, nextW);⓪*writeCode (increaseWidth);⓪*INC (bitWidth);⓪(END;⓪(currentString[0] := ch;⓪(stringLength := 1;⓪(currentCode := ORD (ch);⓪&END;⓪$END;⓪$writeCode (currentCode);⓪$IF bit # 0 THEN INC (codeLen) END;⓪$IF destLenSave >= 6L THEN⓪&IF codeLen > sourceLen THEN⓪((* Kodierung verwerfen, Daten unkodiert übernehmen *)⓪(codeLen:= sourceLen + 6L;⓪(Block.Copy (source,⓪4LowerLCard (sourceLen, destLenSave - 6L),⓪4ADDRESS (destSave) + 6L);⓪((* Kennung: Daten nicht kodiert *)⓪(destSave^:= 0;⓪&ELSE⓪((* Kennung: Daten kodiert *)⓪(destSave^:= 1;⓪&END;⓪&IF codeLen > destLenSave THEN⓪((* Kennung: Daten nicht vollständig *)⓪(destSave^:= MaxCard;⓪&END;⓪&destLP:= ADDRESS (destSave) + 2L;⓪&destLP^:= sourceLen⓪$END;⓪$DEALLOCATE (table, 0 (* TSIZE (codeTaElem) * LONG (maxTable + 1) *) );⓪$DEALLOCATE (hash, 0 (* TSIZE (hashTaElem) * LONG (maxHash + 1) *) );⓪"END Encode;⓪ ⓪ ⓪ PROCEDURE initDecodeTable (VAR table: decodeTable);⓪ ⓪"(*⓪"VAR i : CARDINAL;⓪"BEGIN⓪"⓪$FOR i := 0 TO 255 DO⓪&table^[i].first := CHR(i);⓪&table^[i].last  := CHR(i);⓪&table^[i].prefix := MaxCard;⓪$END;⓪$⓪"END initDecodeTable;⓪"*)⓪"⓪"(*$L-*)⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.W  #255, D0⓪(MOVE.L  #-1 - $FFFF, D1⓪(MOVE.L  -(A3), A0⓪(MOVE.L  (A0), A0⓪ loop⓪(MOVE.L  D1, (A0)+⓪(ADD.W   #$0101, D1⓪(DBF     D0, loop⓪$END;⓪"END initDecodeTable;⓪"(*$L=*)⓪ ⓪ ⓪ PROCEDURE Decode (    source   : ADDRESS;⓪6sourceLen: LONGCARD;⓪6dest     : ADDRESS;⓪6destLen  : LONGCARD;⓪2VAR success  : BOOLEAN );⓪"⓪"CONST tabElemSize = 4;⓪ ⓪"VAR table          : decodeTable;⓪&lastCode,⓪&code, nextEntry,⓪&bit, bitWidth  : CARDINAL;⓪&endOfSource    : BOOLEAN;⓪&kennung        : ptrCard;⓪&ptrL           : POINTER TO LONGCARD;⓪&charDest       : ptrChar;⓪ ⓪ ⓪"PROCEDURE readCode (): CARDINAL;⓪$⓪$(*$L-*)⓪$BEGIN⓪&ASSEMBLER⓪(MOVE.L  D3, -(A7)⓪(MOVE.L  D4, -(A7)⓪(⓪(MOVE.L  source(A6), A0⓪(MOVE.L  sourceLen(A6), D2⓪(MOVE.W  bitWidth(A6), D1⓪(ADD.W   bit(A6), D1⓪(MOVEQ   #0, D3⓪(MOVEQ   #0, D0⓪(⓪ loop⓪(TST.L   D2⓪(BEQ     sourceEnded⓪(MOVEQ   #0,D4⓪(MOVE.B  (A0)+, D4⓪(LSL.L   D3, D4⓪(OR.L    D4, D0⓪(ADDQ.W  #8, D3⓪(SUBQ.L  #1, D2⓪(SUBQ.W  #8, D1⓪(BHI     loop⓪(BEQ     notByteAligned⓪(⓪(SUBQ.L  #1, A0⓪(ADDQ.L  #1, D2⓪(⓪ notByteAligned⓪(MOVE.W  bit(A6), D1⓪(LSR.L   D1, D0⓪(ADD.W   bitWidth(A6), D1⓪(ANDI.W  #7, D1⓪(MOVE.W  D1, bit(A6)⓪(MOVE.L  A0, source(A6)⓪(MOVE.L  D2, sourceLen(A6)⓪(MOVEQ   #-1, D1⓪(MOVE.W  bitWidth(A6), D2⓪(LSL.W   D2, D1⓪(NOT     D1⓪(AND.W   D1, D0⓪(BRA     ende⓪ ⓪ sourceEnded⓪(MOVE.W  #TRUE, endOfSource(A6)⓪ ⓪ ende⓪(MOVE.W  D0, (A3)+⓪(⓪(MOVE.L  (A7)+, D4⓪(MOVE.L  (A7)+, D3⓪&END;⓪$END readCode;⓪$(*$L=*)⓪$⓪"PROCEDURE writeCode (code: CARDINAL);⓪$⓪$(*⓪$VAR last, next,⓪(zws       : CARDINAL;⓪(back      : BOOLEAN;⓪$⓪$BEGIN⓪&back := FALSE;⓪&next := table^[code].prefix;⓪&last := MaxCard;⓪&WHILE NOT back OR (next # MaxCard) DO⓪&⓪(IF next = MaxCard THEN⓪*back := TRUE;⓪*zws := next; next := last; last := zws;⓪(ELSE⓪*table^[code].prefix := last;⓪*last := code;⓪*code := next;⓪*next := table^[code].prefix;⓪(END;⓪(IF back AND (destLen # 0L) THEN⓪*charDest^ := table^[code].last;⓪*INC (charDest);⓪*DEC (destLen);⓪(END;⓪'⓪&END;⓪&table^[code].prefix := last;⓪$END writeCode;⓪$*)⓪$⓪$(*$L-*)⓪$BEGIN⓪&ASSEMBLER⓪(MOVEM.L D3-D4, -(A7)⓪(⓪(;  D0.W -- 'next'⓪(;  D1.W -- 'code'⓪(;  D2.W -- 'last'⓪(;  D3.W -- 'back'⓪(;  D4.W -- zws⓪(;  A0.L -- 'table'⓪(;  A1.L -- zws⓪(;  A2.L -- 'charDest'⓪(;⓪(MOVE.L  table(A6), A0                   ; 'table' -> A0⓪(MOVE.L  charDest(A6), A2                ; 'charDest' -> A2⓪(MOVE.W  -(A3), D1                       ; 'code' -> D1⓪(CLR.W   D3                              ; 'back := FALSE'⓪(MOVE.L  A0, A1⓪(MOVE.W  D1, D4⓪(EXT.L   D4⓪(LSL.L   #2, D4⓪(MOVE.W  decodeTaElem.prefix(A1,D4.L),D0 ; 'table^[code].prefix' -> D0⓪(MOVE.W  #MaxCard, D2                    ; 'MaxCard' -> D2⓪ loop⓪(TST.W   D3⓪(BEQ     loopBody⓪(CMP.W   #MaxCard, D0⓪(BEQ     loopEnd⓪H; WHILE NOT back OR (next # MaxCard) DO⓪ loopBody⓪(CMP.W   #MaxCard, D0⓪(BNE     else⓪(⓪(MOVE.W  #TRUE, D3;                      ; 'back := TRUE'⓪(EXG     D0, D2                          ; EXG ('next', 'last')⓪(BRA     if1End⓪ else⓪ ⓪(MOVE.L  A0, A1⓪(MOVE.W  D1, D4⓪(EXT.L   D4⓪(LSL.L   #2, D4⓪(MOVE.W  D2, decodeTaElem.prefix(A1,D4.L); 'table^[code].prefix := last'⓪(MOVE.W  D1, D2                          ; 'last := code'⓪(MOVE.W  D0, D1                          ; 'code := next'⓪(MOVE.L  A0, A1⓪(MOVE.W  D1, D4⓪(EXT.L   D4⓪(LSL.L   #2, D4⓪(MOVE.W  decodeTaElem.prefix(A1,D4.L),D0 ; 'next := table^[code].prefix'⓪(⓪ if1End⓪(TST.W   D3⓪(BEQ     if2End⓪(TST.L   destLen(A6)⓪(BEQ     if2End⓪(⓪(; 'charDest^ := table^[code].last'⓪(; 'INC (charDest)'⓪(;⓪(MOVE.L  A0, A1⓪(MOVE.W  D1, D4⓪(EXT.L   D4⓪(LSL.L   #2, D4⓪(MOVE.B  decodeTaElem.last(A1,D4.L), (A2)+⓪(⓪(SUBQ.L  #1, destLen(A6)                         ; 'DEC (destLen)'⓪ if2End⓪(BRA     loop⓪(⓪ loopEnd⓪(MOVE.L  A0, A1⓪(MOVE.W  D1, D4⓪(EXT.L   D4⓪(LSL.L   #2, D4⓪(MOVE.W  D2,decodeTaElem.prefix(A1,D4.L) ; 'table^[code].prefix := last'⓪(MOVE.L  A2,charDest(A6)                 ; setzt neuen 'charDest'⓪(⓪(MOVEM.L (A7)+, D3-D4⓪&END;⓪$END writeCode;⓪$(*$L=*)⓪$⓪ (*⓪"PROCEDURE toBuffer (str: ARRAY OF CHAR);⓪$VAR i: CARDINAL;⓪$BEGIN⓪&i := 0;⓪&WHILE (HIGH (str) >= i) AND (str[i] # 0C) AND (destLen # 0L) DO⓪(charDest^ := str[i];⓪(INC (charDest);⓪(DEC (destLen);⓪(INC (i);⓪&END;⓪$END toBuffer;⓪ *)⓪ ⓪"BEGIN (* Decode *)⓪ ⓪$success:= FALSE;⓪ ⓪$IF sourceLen <= 6L THEN ASSEMBLER MOVEQ #3,D1 END; RETURN END;⓪$kennung:= source;⓪$INC (source, 6L);⓪$DEC (sourceLen, 6L);⓪$IF kennung^ = 0 THEN⓪ ⓪&IF destLen >= sourceLen THEN⓪(Block.Copy (source, sourceLen, dest);⓪(success:= TRUE⓪&END; (* ansonsten bleibt 'success' FALSE *)⓪&ASSEMBLER MOVEQ #2,D1 END;⓪ ⓪$ELSIF kennung^ = 1 THEN⓪ ⓪&ALLOCATE (table, TSIZE(decodeTaElem) * LONG (maxTable + 1));⓪&IF table = NIL THEN ASSEMBLER MOVEQ #1,D1 END; RETURN END;⓪&IF dest = NIL THEN destLen := 0L END;⓪&charDest := dest;⓪ ⓪&bit := 0;⓪&bitWidth := 9;⓪&nextEntry := firstFreeEntry;⓪&initDecodeTable (table);⓪&endOfSource := FALSE;⓪&code := readCode ();⓪&lastCode := code;⓪&writeCode (code);⓪&⓪&IF NOT endOfSource THEN code := readCode () END;⓪&(*⓪&WHILE NOT endOfSource DO⓪&⓪(IF code = increaseWidth THEN INC (bitWidth);⓪(ELSIF code = newTable THEN⓪(⓪*(*initDecodeTable (table);*)⓪*bitWidth := 9;⓪*nextEntry := firstFreeEntry;⓪ ⓪*code := readCode ();⓪*lastCode := code;⓪*writeCode (code);⓪*⓪(ELSIF code < nextEntry THEN⓪(⓪*writeCode (code);⓪*table^[nextEntry].prefix := lastCode;⓪*table^[nextEntry].first  := table^[lastCode].first;⓪*table^[nextEntry].last   := table^[code].first;⓪*INC (nextEntry);⓪*lastCode := code;⓪*⓪(ELSE⓪(⓪*table^[nextEntry].prefix := lastCode;⓪*table^[nextEntry].first  := table^[lastCode].first;⓪*table^[nextEntry].last   := table^[lastCode].first;⓪*writeCode (nextEntry);⓪*lastCode := nextEntry;⓪*INC (nextEntry);⓪*⓪(END;⓪(⓪(code := readCode ();⓪"(*⓪"toBuffer (15C); toBuffer (12C);⓪"toBuffer (HexToStr (code, 0)); toBuffer ('=');⓪"*)⓪&END;⓪&*)⓪&ASSEMBLER⓪ whileStart⓪(TST.W   endOfSource(A6)⓪(BNE.W   whileEnd                        ; 'WHILE NOT endOfSource DO'⓪(⓪(MOVE.W  code(A6), D0⓪(CMP.W   #increaseWidth, D0⓪(BNE     elsif1⓪(⓪(ADDQ.W  #1, bitWidth(A6)⓪(BRA.W   ifEnd⓪(⓪ elsif1⓪(CMP.W   #newTable, D0⓪(BNE     elsif2⓪(⓪(MOVE.W  #9, bitWidth(A6)                ; 'bitWidth := 9'⓪(MOVE.W  #firstFreeEntry, nextEntry(A6)  ; 'nextEntry := firstFreeEntry'⓪(BSR     readCode⓪(MOVE.W  -2(A3), D0⓪(MOVE.W  D0, code(A6)                    ; 'code := readCode ()'⓪(MOVE.W  D0, lastCode(A6)                ; 'lastCode := code'⓪(BSR     writeCode                       ; 'writeCode (code)'⓪(BRA.W   ifEnd⓪ ⓪ elsif2⓪(CMP.W   nextEntry(A6), D0⓪(BCC     else⓪(⓪(MOVE.W  D0, (A3)+⓪(BSR     writeCode                       ; 'writeCode (code)'⓪(MOVE.L  table(A6), A0⓪(MOVE.L  A0, A1⓪(MOVE.L  A0, A2⓪(MOVE.W  nextEntry(A6), D1⓪(EXT.L   D1⓪(LSL.L   #2, D1⓪(ADDA.L  D1, A0⓪(MOVE.W  lastCode(A6), D1⓪(MOVE.W  D1, D2⓪(EXT.L   D1⓪(LSL.L   #2, D1⓪(ADDA.L  D1, A1⓪(MOVE.W  code(A6), D1⓪(EXT.L   D1⓪(LSL.L   #2, D1⓪(ADDA.L  D1, A2⓪(⓪(; table^[nextEntry].prefix := lastCode;⓪(;⓪(MOVE.W  D2, decodeTaElem.prefix(A0)⓪(⓪(; table^[nextEntry].first  := table^[lastCode].first;⓪(;⓪(MOVE.B  decodeTaElem.first(A1), decodeTaElem.first(A0)⓪(⓪(;  table^[nextEntry].last   := table^[code].first;⓪(;⓪(MOVE.B  decodeTaElem.first(A2), decodeTaElem.last(A0)⓪(⓪(ADDQ.W  #1, nextEntry(A6)               ; 'INC (nextEntry)'⓪(MOVE.W  code(A6), lastCode(A6)          ; 'lastCode := code'⓪(BRA     ifEnd⓪ ⓪ else⓪(MOVE.L  table(A6), A0⓪(MOVE.L  A0, A1⓪(MOVE.W  nextEntry(A6), D1⓪(MOVE.W  D1, D2⓪(EXT.L   D1⓪(LSL.L   #2, D1⓪(ADDA.L  D1, A0⓪(MOVE.W  lastCode(A6), D1⓪(EXT.L   D1⓪(LSL.L   #2, D1⓪(ADDA.L  D1, A1⓪(⓪(; table^[nextEntry].prefix := lastCode;⓪(;⓪(MOVE.W  lastCode(A6), decodeTaElem.prefix(A0)⓪(⓪(; table^[nextEntry].first  := table^[lastCode].first;⓪(;⓪(MOVE.B  decodeTaElem.first(A1), D0⓪(MOVE.B  D0,  decodeTaElem.first(A0)⓪(⓪(; table^[nextEntry].last   := table^[lastCode].first;⓪(;⓪(MOVE.B  D0, decodeTaElem.last(A0)⓪(⓪(MOVE.W  D2, (A3)+⓪(BSR     writeCode                       ; 'writeCode (nextEntry)'⓪(MOVE.W  nextEntry(A6), lastCode(A6)     ; 'lastCode := nextEntry'⓪(ADDQ.W  #1, nextEntry(A6)               ; 'INC (nextEntry)'⓪ ⓪ ifEnd⓪(BSR     readCode⓪(MOVE.W  -(A3), code(A6)                 ; 'code := readCode ()'⓪(BRA     whileStart⓪ ⓪ whileEnd⓪&END;⓪&DEALLOCATE (table, 0 (* TSIZE(decodeTaElem) * LONG (maxTable + 1)*) );⓪&⓪&IF destLen = 0L THEN⓪(success:= TRUE⓪&END;⓪&ASSEMBLER MOVEQ #2,D1 END;⓪$ELSE⓪&(* ungültige Kennung! *)⓪&ASSEMBLER MOVEQ #4,D1 END;⓪$END;⓪"END Decode;⓪ ⓪ PROCEDURE GetInfo (     code:   ADDRESS;⓪4VAR type:   CARDINAL;⓪4VAR length: LONGCARD );⓪"VAR pl: POINTER TO LONGCARD;⓪&pc: ptrCard;⓪"BEGIN⓪$pc:= code;⓪$pl:= code + 2L;⓪$type:= pc^;⓪$length:= pl^⓪"END GetInfo;⓪ ⓪ END Compressions.⓪ ə
  2. (* $FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$000000ED$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEA7F3A$000015C8$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$FFEC9820$000021E3$FFEC9820$FFEC9820$FFEC9820Ç$0000002ET.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$000031EC$00003384$0000337B$000031A4$0000426C$000042AB$000042A0$00004261$0000428E$0000424F$000032F6$0000002E$0000006E$00000035$000000ED$00003188ãÇé*)
  3.